package com.czl.myRabbitMq.mqServer.core;

import lombok.Data;
import lombok.ToString;

import java.io.Serializable;
import java.util.UUID;

//消息队列消息
//Serializable是能够将类序列化 实现接口即可 不用复写方法
@Data
@ToString
public class Message implements Serializable {
    private BasicProperties properties = new BasicProperties();

    //用二进制数组来对消息内容进行存储
    private byte[] message;

    /**
     因为消息对CRUD的需求不大 所以后续通过文件来进行存储
     一个文件在存储过程中可能会涉及到存储多个消息，同时消
     息为二进制序列，为便于直接找到消息引入offsetBegan
     表示当前消息的开始字节在文件中对应的位置，同时offsetEed
     表示消息在文件中结束的位置。[offsetBegan,offsetEnd)
     */
    //这2个属性 不需要序列化到文件中 消息一旦保存到文件中，开始和结束位置便固定了 不需要进行单独的存储
    //transient关键字就是将不需要序列化的属性提取出来
    private transient long offsetBegan;
    private transient long offsetEnd;
    //表示逻辑删除,因为消息在存储过程中保存在文件中，所以
    //本文通过逻辑删除的方式进行删除
    // 0x1表示有效
    // 0x0表示无效
    private byte isDelete = 0x1;
    public static Message createMessage(String routineKey, BasicProperties properties, byte[] body){
        Message mes = new Message();

        if(properties != null) {
            mes.setProperties(properties);
        }else {
            mes.setMessageName("M-" + UUID.randomUUID());//使用UUID来生成消息名称消息前缀加上M
            mes.setMessageRoutineKey(routineKey);
        }
        mes.setMessage(body);
        return mes;
    }

    public String getMessageName(){
        return properties.getMessageId();
    }
    public void setMessageName(String id){
        properties.setMessageId(id);
    }
    public String getMessageId(){
        return properties.getMessageId();
    }
    public void setMessageId(String messageId){
        properties.setMessageId(messageId);
    }
    public String getMessageRoutineKey(){
        return properties.getRoutineKey();
    }
    public void setMessageRoutineKey(String key){
        properties.setRoutineKey(key);
    }
    public int getDurable(){
        return properties.getDurable();
    }

}
